//
// Created by ds on 24-7-1.
//

#ifndef RTIHELPER_H
#define RTIHELPER_H
#include <fedtime.hh>
#include <RTI.hh>
#include "HwFederateAmbassador.hh"
#include "RtiEntity.h"
#include "Entity.h"

class RtiHelper {
    const char *federationExecutionName{};
    const char *fedFile{};
    const char *federateName{};


    /**
     * 联邦仿真步长
     */
    RTIfedTime intervalTime = 0.01;

    /**
     * 当前的时间
     */
    RTIfedTime *g_currentTime{};

    /**
     * 启用时间限制。RTI同意将仿真成员设置为时间管理受限的成员
     */
    bool *g_bConstrained{};

    /**
     * 启用时间调节。RTI同意将仿真成员设置为时间管控成员
     */
    bool *g_bRegulation{};

    /**
     * 推进下一步标志位
     */
    bool *g_granted{};

    RTI::RTIambassador rti;
    HwFederateAmbassador fedAmb;
    RTI::FederateHandle federateId{};

public:
    explicit RtiHelper(const Ns3Arguments& carlaArguments);

    RtiHelper(const char *federationExecutionName, const char *fedFile, const char *federateName);

    RtiHelper(const char *federationExecutionName, const char *fedFile, const char *federateName, double interval_time);

    void setIntervalTime(double interval_time);

    void initGlobalFlag(RTIfedTime *g_currentTime, bool *g_bConstrained, bool *g_bRegulation, bool *g_granted);

    /**
     * 创建联邦执行
     * @return RTIambassadorReturn
     */
    RTIambassadorReturn createFederationExecution();

    /**
     * 加入联邦执行
     * @return FederateHandleReturn
     */
    FederateHandleReturn joinFederationExecution();

    /**
     * 获取交互类句柄
     * @param theName 交互类名
     * @return
     */
    RTI::InteractionClassHandle getInteractionClassHandle(const char *theName);

    /**
     * 获取对象类句柄
     * @param theName
     * @return
     */
    RTI::ObjectClassHandle getObjectClassHandle(const char *theName);

    /**
     * 获取交互类参数
     * @param theName 参数名
     * @param whichClass 类句柄
     * @return
     */
    RTI::ParameterHandle getParameterHandle(const char *theName, RTI::InteractionClassHandle whichClass);

    /**
     * 获取对象类属性
     * @param theName 参数名
     * @param whichClass 类句柄
     * @return
     */
    RTI::AttributeHandle getAttributeHandle(const char *theName, RTI::ObjectClassHandle whichClass);

    /**
     * 订阅交互类
     * @param theClass 交互类句柄
     */
    void subscribeInteractionClass(RTI::InteractionClassHandle theClass);

    /**
     * 将仿真成员设置为时间管理受限的
     */
    void enableTimeConstrained();

    /**
     * 将仿真成员设置为可以管理时间的
     * @param theFederateTime 联邦最小仿真步长
     * @param theLookahead 联邦向前看时间
     */
    void enableTimeRegulation(double theFederateTime, double theLookahead);

    /**
     * 打开异步消息开关
     */
    void enableAsynchronousDelivery();

    /**
     * 请求时间推进
     */
    void timeAdvanceRequest();

    /**
     * 注销联邦执行
     */
    void resignFederationExecution();

    /**
     * 摧毁联邦执行
     */
    void destroyFederationExecution();
};
#endif //RTIHELPER_H
